草庐IT

C++ Templates 多态障碍

全部标签

c++ - 避免运行时多态性的性能问题

在数以千计的处理器上运行10小时的数字代码中,我有一个基类(Mesh),其方法被命中数百万次到100到1000次。目前有两个(Mesh_A,Mesh_B)派生类,但最终会扩展到三个或四个。用户代码直到运行时才能知道其指向Mesh的指针实际上是Mesh_A还是Mesh_B,但对于运行的其余部分,它永远不会改变。当前实现://BaseclassclassMesh{...virtualconstPoint&cell_centroid(intc)=0;}//derivedclassAclassMeshA:publicMesh{...Point&cell_centroid(intc){retur

c++ - 将静态访问者与静态多态性层次结构耦合

我的程序的目的是创建一个数据列表,我可以在我的类层次结构中使用静态多态性时使用一组静态访问者访问它。我已经通过CRTP使用静态多态性创建了类的层次结构:classVirtualBaseData{public://someVirtualFunction}templateclassBaseData{public:templatevoidaccept(Visitor&v){static_cast(this)->accept(v);}}classDerivedBaseData1:BaseData{public:templatevoidaccept(Visitor&v){//Specificim

c++ - 支持多态的Stored-by-Value Pool,如何使用智能指针?

介绍我有一个数据结构:值池。(不是指针池)当我调用create()时,它会返回Handle。到目前为止一切都很好。templateclassPool{std::vectorv;//storebyvalueHandlecreate(){....}}templateclassHandle{Pool*pool_;//pointerbacktocontainerintpool_index_;//whereIaminthecontainerT*operator->(){returnpool_->v.at(pool_index_);//i.e."pool[index]"}voiddestroy()

c++ - bisonc++ 多态继承

我正在尝试从野牛语法构建AST。Bison正确生成了解析器,但是当我尝试使用一些数学运算解析示例代码时,打印出以下错误:[Fatal]calling`.get()',butTagINTisencountered.调试后我注意到问题出在expr非终端中,产生式如下:expr:...|operator{$$=$1;}并且operator本身有以下产生式:operator:...|INTEGER{$$=newast::expression::IntASTNode(std::stoi(d_scanner.matched()));}我正在使用多态语义类型,expr和operator被标记为响应E

c++ - C++中是否存在任何隐式内存障碍

在下面的代码中,是使用必要的原子来保证所有平台上的无竞争语义,还是使用promise.set_value/future.wait暗示某种隐式内存屏障,这将允许我依赖标志写入对外线程可见?std::atomic_boolflag{false};//voidrunInThreadPoolBlocking(Callablefunc){std::promiseprom;autofut=prom.get_future();enqueueToThreadPool([&](){func();prom.set_value();});fut.get();}一般来说,对于thread.join()或fut

c++ - 阻止编译器优化的多态性示例?

不记得我现在在哪里看到它-但我在某处读到动态多态性阻止编译器进行各种优化。除了内联之外,有人可以用多态性阻止编译器进行的此类“错过”优化机会的任何示例来启发我吗? 最佳答案 与:Derivedd;d.vMethod();//thatwillcallDerived::vMethodstatically(allowinginlining).使用(除非Derived或Derived::vMethod之一在C++11中被声明为final):voidfoo(Derived&d){d.vMethod();//thiswillcallvirtua

c++ - std::bind 和 boost::bind 与多态性的区别

我有一个派生类,我从中绑定(bind)了一个我没有在这个类中重写的虚函数,所以我希望调用父类中的一个。它适用于boost(1.55),但如果我从C++11切换到std::bind,它会拒绝使用进行编译errorC2100:illegalindirection1>functional(1152):seereferencetofunctiontemplateinstantiation'_Rxstd::_Pmf_wrap::operator()(_Wrapper&)const'beingcompiled1>with1>[1>_Rx=bool,1>_Pmf_t=bool(__thiscallB

c++ - 避免多态类中的虚表

根据thispage,Microsoft的扩展属性__declspec(novtable)“阻止编译器生成代码来初始化类的构造函数和析构函数中的vfptr……使用这种形式的__declspec可以显着减少代码大小。”我使用VisualStudio2013update4、发布配置、x64编译了以下代码,并获得了后面显示的汇编代码。struct__declspec(novtable)textEmpty{virtualvoidfs()=0;};structtextEmpty2{virtualvoidfs()=0;};structY:textEmpty{voidfs()override;};v

C++依赖注入(inject)多态性

我有一个关于使用多态类进行依赖注入(inject)的最佳实践的问题。我是C++的新手,所以如果这是一个明显的问题,请原谅我。假设我有一个Runner类,它需要接收两个对象,一个Logger和一个Worker。Logger是一个抽象类,有两个子类,比如FileLogger和SocketLogger。同样,Worker是一个抽象类,有两个子类,比如ApproximateWorker和CompleteWorker。Runner类将从main()创建,并将基于配置文件或类似文件创建Logger和Worker。我已经阅读了很多有关SO和其他地方的资料,普遍的看法似乎是更喜欢堆栈分配的对象并通过引

c++ - 智能指针作为多态性的类成员

我是智能指针的新手,如果有人可以提示我作为类成员处理智能指针的方式是否正确,我将不胜感激。更准确地说,我想要实现的解决方案是在类多态性的上下文中,理想情况下应该是异常安全的。给定一个containerofheterogeneuousobjects(std::vector>my_vector),通常添加元素的方式是:my_vector.push_back(shared_ptr(newCChild(1))),以便稍后可以通过以下方式调用特定派生类的成员函数:my_vector[0]->doSomething().我想要实现的是将堆栈对象添加到vector并且仍然能够进行多态性。直觉上……喜